package com.example.sys.config;

import com.example.common.utils.IdUtils;
import com.example.sys.dao.*;
import com.example.sys.entity.po.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 初始化配置
 */
@Component
@Slf4j
public class InitializeSys implements InitializingBean {
    @Resource
    private IdUtils idUtils;
    @Resource
    private PasswordEncoder passwordEncoder;
    @Resource
    private SysUserDao sysUserDao;
    @Resource
    private SysUserRoleDao sysUserRoleDao;
    @Resource
    private SysRoleDao sysRoleDao;
    @Resource
    private SysRoleMenuDao sysRoleMenuDao;
    @Resource
    private SysMenuDao sysMenuDao;

    @Resource
    private SysUserRepository sysUserRepository;
    @Resource
    private SysRoleRepository sysRoleRepository;
    @Resource
    private SysUserRoleRepository sysUserRoleRepository;

    @Resource
    private SysMenuRepository sysMenuRepository;
    @Resource
    private SysRoleMenuRepository sysRoleMenuRepository;

    /**
     * 初始化表,如果表不存在就创建
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() {
        //初始表
        initializeSysUser();        //初始化用户表
        initializeSysUserRole();    //初始化用户角色表
        initializeSysRole();        //初始化角色表
        initializeSysRoleMenu();    //初始化角色菜单表
        initializeSysMenu();        //初始化菜单表
        //初始数据
        Optional<SysUser> optionalSysUser = sysUserRepository.findById(0L);     //初识化用户 admin
        if (!optionalSysUser.isPresent()) {  //如果不存在
            log.info("初始化用户 admin ...");
            SysUser sysUser = SysUser.builder()
                    .userId(0L)
                    .userName("admin")
                    .nickName("admin")
                    .userPwd(passwordEncoder.encode("123456"))
                    .avatar("https://img1.baidu.com/it/u=1691245952,2293333629&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400")
                    .iphoneNo("15251922665")
                    .emailAddress("939949243@qq.com")
                    .gender(1)
                    .identityCard("320924199505303812")
                    .homeAddress("江苏省苏州市虎丘区鸿文雅苑44幢2301室")
                    .briefIntroduction("我是系统超级管理员")
                    .status(1)
                    .showOrder(0L)
                    .createTime(LocalDateTime.now())
                    .build();
            sysUserRepository.save(sysUser);
        }

        Optional<SysRole> optionalSysRole = sysRoleRepository.findById(0L);     //初始化角色 管理员
        if (!optionalSysRole.isPresent()) {
            log.info("初始化角色 系统管理员 ...");
            SysRole sysRole = SysRole.builder()
                    .roleId(0L)
                    .roleName("系统管理员")
                    .roleDesc("最高权限")
                    .status(1)
                    .showOrder(0L)
                    .createTime(LocalDateTime.now())
                    .build();
            sysRoleRepository.save(sysRole);
        }

        Optional<SysUserRole> optionalSysUserRole = sysUserRoleRepository.findById(0L); //初始化 用户角色关联
        if (!optionalSysUserRole.isPresent()) {
            log.info("初始化用户角色关系 admin-系统管理员 ...");
            SysUserRole sysUserRole = SysUserRole.builder()
                    .userRoleId(0L)
                    .userId(0L)
                    .roleId(0L)
                    .build();
            sysUserRoleRepository.save(sysUserRole);
        }

        List<SysMenu> sysMenuList = sysMenuRepository.findByPid(-1L);        //查询父级为0的菜单
        if (sysMenuList.isEmpty()) {
            log.info("初始化菜单 menu ...");

            SysMenu home = SysMenu.builder().menuId(0L).menuName("首页").menuCode("home").menuIcon("home").type(1).pid(-1L).status(1).showOrder(0L).build();
            SysMenu sys = SysMenu.builder().menuId(1L).menuName("系统").menuCode("sys").menuIcon("sys").type(1).pid(-1L).status(1).showOrder(1L).build();

            SysMenu sysUser = SysMenu.builder().menuId(10L).menuName("用户").menuCode("sysUser").menuIcon("sysUser").type(1).pid(1L).status(1).showOrder(0L).build();
            SysMenu sysRole = SysMenu.builder().menuId(11L).menuName("角色").menuCode("sysRole").menuIcon("sysRole").type(1).pid(1L).status(1).showOrder(1L).build();
            SysMenu sysMenu = SysMenu.builder().menuId(12L).menuName("菜单").menuCode("sysMenu").menuIcon("sysMenu").type(1).pid(1L).status(1).showOrder(2L).build();

            sysMenuList.add(home);
            sysMenuList.add(sys);
            sysMenuList.add(sysUser);
            sysMenuList.add(sysRole);
            sysMenuList.add(sysMenu);
            sysMenuRepository.saveAll(sysMenuList);
        }

        List<SysRoleMenu> sysRoleMenuList = sysRoleMenuRepository.findByRoleId(0L);    //查询角色分配菜单
        if(sysRoleMenuList.isEmpty()){
            log.info("初始化角色菜单 role-menu ...");
            SysRoleMenu home = SysRoleMenu.builder().roleMenuId(idUtils.nextId()).roleId(0L).menuId(0L).build();
            SysRoleMenu sys = SysRoleMenu.builder().roleMenuId(idUtils.nextId()).roleId(0L).menuId(1L).build();
            SysRoleMenu user = SysRoleMenu.builder().roleMenuId(idUtils.nextId()).roleId(0L).menuId(10L).build();
            SysRoleMenu role = SysRoleMenu.builder().roleMenuId(idUtils.nextId()).roleId(0L).menuId(11L).build();
            SysRoleMenu menu = SysRoleMenu.builder().roleMenuId(idUtils.nextId()).roleId(0L).menuId(12L).build();

            sysRoleMenuList.add(home);
            sysRoleMenuList.add(sys);
            sysRoleMenuList.add(user);
            sysRoleMenuList.add(role);
            sysRoleMenuList.add(menu);
            sysRoleMenuRepository.saveAll(sysRoleMenuList);
        }
    }

    /**
     * 初始化用户表
     */
    public void initializeSysUser() {
        String sysUser = sysUserDao.selectTableExists("sys_user");
        if (sysUser == null || sysUser.length() == 0) {
            log.info("没有用户表 sys_user ,创建用户表");
            sysUserDao.createTable();
        }
    }

    /**
     * 初始化用户角色表
     */
    private void initializeSysUserRole() {
        String sysUserRole = sysUserRoleDao.selectTableExists("sys_user_role");
        if (sysUserRole == null || sysUserRole.length() == 0) {
            log.info("没有用户角色表 sys_user_role ,创建用户角色表");
            sysUserRoleDao.createTable();
        }
    }

    /**
     * 初始化角色表
     */
    private void initializeSysRole() {
        String sysRole = sysRoleDao.selectTableExists("sys_role");
        if (sysRole == null || sysRole.length() == 0) {
            log.info("没有角色表 sys_role ,创建角色表");
            sysRoleDao.createTable();
        }
    }

    /**
     * 初始化角色菜单表
     */
    private void initializeSysRoleMenu() {
        String sysRoleMenu = sysRoleMenuDao.selectTableExists("sys_role_menu");
        if (sysRoleMenu == null || sysRoleMenu.length() == 0) {
            log.info("没有角色菜单表 sys_role_menu ,创建角色菜单表");
            sysRoleMenuDao.createTable();
        }
    }

    /**
     * 初始化菜单表
     */
    private void initializeSysMenu() {
        String sysMenu = sysMenuDao.selectTableExists("sys_menu");
        if (sysMenu == null || sysMenu.length() == 0) {
            log.info("没有角色表 sys_menu ,创建角色表");
            sysMenuDao.createTable();
        }
    }
}
